#include "OutputSender.h"
#include "Queues.h"
#include "../smtp/core/Sender.h"
#include "../config/Config.h"
#include "../system/Observers.h"
#include "Serializer.h"

using namespace kc_sf;

// do 3 razy sztuka

// --------------------------------------------------------------- //

OutputSender::OutputSender()
{
	Config &cfg = Config::getInstance();
	qs_smtp_server = cfg.cSmtpServer;
	qs_smtp_port = cfg.cSmtpPort;
	qs_is_sending = false;
}

// --------------------------------------------------------------- //

void OutputSender::start()
{
	qs_is_sending = true;
	while( qs_is_sending )
	{
		TryRawMessage try_rmsg = OutputMessageQueue.waitAndPop();

		Sender output_sender;
		output_sender.connectToServer( qs_smtp_server, qs_smtp_port );
		if( !output_sender.sendMail( dynamic_cast<RawMessage &>( try_rmsg ) ) )
		{
			try_rmsg.SendAttemptsNumber += 1;
			if( try_rmsg.SendAttemptsNumber >= 3 )
			{
				//zapisz w kwarantannie
			    qs_logger << info  << sender << mid( try_rmsg.Id )
			    		<< "3 nieudane próby wysłania wiadomości." << newLine
			    		<< "Umieszczono wiadomość w kwarantannie" << flush;

				Serializer serializer( Config::getInstance().getPathToQuarantine(), try_rmsg );
				std::string filepath = serializer();
				QuarantineObserver.add();
			}
			else
			{
				OutputMessageQueue.push( try_rmsg );
				OutputMessageQueueObserver.add();

			    qs_logger << detail  << sender << mid( try_rmsg.Id )
			    		<< try_rmsg.SendAttemptsNumber << " nieudana próba wysłania wiadomości." << newLine
			    		<< "Nowa wiadomość w kolejce wiadomości wychodzących" << flush;
			}
		}

		output_sender.disconnect();
	}
}

// --------------------------------------------------------------- //

void OutputSender::stop()
{
	qs_is_sending = false;
}
